Введение в процесс загрузки ZYNQ 7000

Обзор процесса загрузки системы

ZYNQ-7000 — это SoC на базе архитектуры ARM Cortex-A9 + FPGA. Его процесс загрузки управляется аппаратно (со стороны PS) и поэтапно выполняет запуск системы и конфигурацию программируемой логики. Процесс загрузки для SoC ZYNQ 7000 — это многоэтапная, гибко настраиваемая процедура, включающая сложные взаимодействия между автоматической аппаратной загрузкой и программным управлением. В этой статье будет представлен подробный анализ всего процесса, от включения питания до загрузки операционной системы.

Этап аппаратной инициализации

Включение питания и аппаратный сброс

Инициализация источников питания и дерева тактирования

Последовательность POR (Power-On Reset)

Конфигурация сети тактирования

Определение режима загрузки

Режим загрузки определяется состоянием выводов MIO[5:2]:

MIO[5:2]Режим загрузкиТактовая частотаШирина данных
0000JTAG--
0010NAND33MHz8-bit
0011NOR50MHz16-bit
0101QSPI100MHz4-bit
0110SD50MHz4-bit

Примечание: Состояние выводов режима считывается и фиксируется по нарастающему фронту сигнала POR_B

Этап BootROM (Stage-0)

BootROM

Код BootROM — это первое программное обеспечение, которое выполняется на устройстве Zynq после включения питания или сброса. Он начинает выполнение с адреса 0xFFFF_0000. BootROM недоступен для пользователя. Код BootROM хранится во встроенном ПЗУ (ROM), отсюда и название BootROM. Поскольку ZYNQ содержит 256КБ ОЗУ (RAM) и 128КБ ПЗУ (ROM), код BootROM может постоянно храниться в ПЗУ и не будет утерян при отключении питания. Обычно внутреннее ПЗУ чипа — это NOR Flash. Ключевой особенностью NOR Flash является eXecute In Place (XIP), что позволяет приложениям выполняться непосредственно из Flash-памяти без необходимости загрузки в системное ОЗУ. Это ПЗУ, встроенное в чип, и его нельзя изменить.

Код BootROM выполняет следующие функции:

Порядок выполнения кода BootROM в режиме загрузки с SD-карты:

  1. Инициализирует выводы MIO, в основном настраивая регистры конфигурации физических характеристик для выводов MIO. Ключевым шагом является мультиплексирование MIO40~MIO45 для выполнения функций выводов CLK/CMD/DATA для периферийного устройства SD0.

  2. Инициализирует периферийное устройство SD-карты и его драйвер, обеспечивая возможность операций чтения/записи на SD-карту.

  3. Тестирует функциональность чтения/записи SD-карты.

  4. Считывает файл BOOT.BIN из файловой системы SD-карты и анализирует заголовок BootROM. Файлу BOOT.BIN предшествует секция заголовка, организованная в определенном формате. Этот заголовок содержит такую информацию, как адрес загрузки FSBL, его размер и смещение внутри файла BOOT.BIN. Код BootROM способен анализировать этот заголовок.

  5. Получив размер, смещение и адрес загрузки кода FSBL, код BootROM копирует код FSBL из файла BOOT.BIN в ОЗУ, а затем переходит по адресу выполнения FSBL для его запуска.

На этом этапе BootROM успешно запустил код FSBL.

Порядок загрузки в режиме QSPI

Последовательность выполнения кода BootROM в режиме загрузки с QSPI выглядит следующим образом:

  1. Инициализация выводов MIO, мультиплексирование соответствующих выводов MIO для выполнения функций, необходимых периферии QSPI.

  2. Инициализация периферии QSPI и её драйвера для устройства QSPI Flash, обеспечение возможности операций чтения/записи QSPI.

  3. Тестирование функциональности чтения/записи QSPI.

  4. Чтение файла BOOT.BIN с носителя QSPI и разбор заголовка Boot ROM.

  5. После получения размера кода FSBL, смещения и адреса загрузки, код BootROM копирует код FSBL из файла BOOT.BIN в RAM и затем переходит по адресу выполнения FSBL для его запуска.

В отличие от метода поиска файловой системы, используемого для SD-карт, в режиме загрузки с QSPI код BootROM сначала ищет файл BOOT.BIN по адресу 0x000000 в QSPI. Если файл не найден, поиск продолжается по адресу 0x008000. Если и там файл не найден, переход осуществляется к следующему адресу 0x10000. Однако диапазон поиска не должен превышать первые 16 МБ адресного пространства QSPI.

Структура файла BOOT.BIN

BOOT.BIN — это основной файл образа загрузки для серии SoC ZYNQ 7000. (Образ загрузки — это упакованный файл, содержащий несколько программ или данных, необходимых для запуска системы, обычно двоичный файл, используемый для руководства системой через весь процесс от включения питания до запуска операционной системы. В Zynq образом загрузки обычно является файл BOOT.BIN. BOOT.BIN — это центральный файл для всей процедуры запуска системы и должен быть размещен в начале загрузочного устройства Zynq. Он считывается и выполняется кодом загрузки ROM Zynq из QSPI, SD-карты или NAND.) Он генерируется инструментом Bootgen на основе файла .bif и содержит все компоненты, необходимые для полной цепочки загрузки. Например:

В приведенном выше примере:

Порядок разделаСодержаниеНазначение
1fsbl.elfПервичный загрузчик, инициализирует оборудование и DDR
2system.bitКонфигурирует PL (FPGA часть)
3u-boot.elfВторичный загрузчик, запускает Linux или другие приложения

Общая структура файла

Детали заголовка загрузки

Заголовок BOOT.BIN — это секция данных в начале файла BOOT.BIN, организованная в определенном формате, который может быть проанализирован кодом BootROM. BootROM считывает Заголовок Загрузки из образа загрузки, чтобы получить информацию об образе, такую как:

Заголовок Загрузки должен существовать и быть правильно отформатирован. В противном случае BootROM не загрузит FSBL.

VeryCapture_20250606155931

VeryCapture_20250606155955

В файле BOOT.bin диапазон адресов от 0 до 0x8FF можно разделить на 17 частей, каждая из которых имеет определенное значение.

  1. 0x000: Таблица векторов прерываний.

  2. 0x020: Фиксированное значение 0xaa995566 (little-endian).

  3. 0x024: Фиксированное значение 0x584c4e58 ASCII: XLNX.

  4. 0x028: Если значение равно 0xa5c3c5a3 или 0x3a5c3c5a, образ зашифрован.

  5. 0x02C: Номер версии заголовка BootROM, можно игнорировать.

  6. 0x030: Этот параметр содержит количество байт от начала действительного заголовка BootROM до местоположения образа FSBL/пользовательского кода, которое является смещением адреса FSBL/пользовательского кода. Это смещение должно быть больше или равно 0x8C0.

  7. 0x034: Записывает длину FSBL, используется для руководства кодом BootROM при копировании FSBL.

  8. 0x038: Адрес загрузки, указывающий, куда копировать FSBL в OCM (обычно 0x0). Он направляет код BootROM, куда копировать FSBL в RAM.

  9. 0x03C: Адрес выполнения FSBL в OCM (обычно определяется как 0x0). Он направляет код BootROM, по какому адресу RAM переходить для выполнения.

  10. 0x040: Записывает длину FSBL.

  11. 0x044: Фиксированное значение 0x01.

  12. 0x048: Контрольная сумма (Вычисляется путем суммирования данных между 0x020 и 0x047 как 32-битных слов с последующим взятием побитового НЕ. Если сумма превышает 32 бита, для операции НЕ используются только младшие 32 бита).

  13. 0x04C-0x097: Пользовательская область для FSBL/пользовательского кода. Можно заполнить нулями, если не нужна.

  14. 0x098: Смещение до таблицы заголовков образов.

  15. 0x09C: Расположение таблицы заголовков разделов.

  16. 0x0A0-0x89F: Параметры для инициализации регистров.

17.0x8C0: FSBL и пользовательский код должны располагаться по этому адресу или после него.

Связанный код и анализ BOOT.BIN:

VeryCapture_20250606162018

Выполнение кода BootROM

Начальный указатель PC

Этап FSBL (Stage-1)

Процесс инициализации

Последовательность конфигурации PS:

  1. Инициализация контроллера DDR

  2. Конфигурация мультиплексирования выводов MIO

  3. Настройка системных тактовых частот

  4. Включение контроллера прерываний

Основная роль FSBL

FSBL — это загрузчик первого этапа (First Stage Bootloader) в процессе загрузки Zynq, который напрямую загружается и выполняется BootROM. Его основные функции включают:

Как FSBL загружает проект приложения?

Сценарий 1: Bare-metal приложение (Standalone)

Взаимодействие между FSBL и приложением

Конфигурация PL

Процесс загрузки Bitstream:

Оценка времени конфигурации:

Размер BitstreamВремя конфигурации (100 МГц)
1MB80ms
5MB400ms
10MB800ms

Как найти U-Boot и Bitstream через BOOT.BIN

Файл BOOT.BIN содержит образ FSBL, образ u-boot и файл bitstream.

Код BootROM должен найти FSBL, разобрав информацию в заголовке BOOT.BIN. Затем код BootROM запускает FSBL.

После запуска кода FSBL он отвечает за поиск образа U-Boot и файла bitstream в файле BOOT.BIN, затем за загрузку файла bitstream в PL-часть ZYNQ и, наконец, за запуск U-Boot.

Это включает в себя три таблицы данных:

Таблица заголовков образов (Image Header Table)

Существует только одна таблица заголовков образов. Таблица заголовков разделов и заголовок образа идут парами. Количество образов, содержащихся в файле BOOT.BIN, определяет количество пар "таблица заголовков разделов - заголовок образа".

VeryCapture_20250609091441

Заголовок образа (Image Header)

VeryCapture_20250609091458

Таблица заголовков разделов (Partition Header Table)

VeryCapture_20250609091702

VeryCapture_20250609091715

Иерархические отношения и функции трех ключевых структур данных: Image Header Table, Partition Header Table и Image Header


Иерархическая структура

VeryCapture_20250609102303


Подробное объяснение

Image Header
Image Header Table
Partition Header Table

Рабочий процесс

BootROM считывает Image Header для проверки целостности образа.

FSBL анализирует Image Header Table для нахождения всех разделов.

Для каждого раздела:

Глубокий анализ исходного кода FSBL (First Stage Boot Loader)

Общая архитектура и процесс загрузки FSBL

FSBL — это первый программируемый пользователем код, выполняемый после включения питания платформы ZYNQ. Он в основном отвечает за инициализацию оборудования и загрузку загрузчика следующего этапа. Его основная архитектура выглядит следующим образом:

image-20250909110824954

Анализ основных модулей кода

Инициализация оборудования (функция main())
Загрузка загрузочного образа (функция LoadBootImage())

Ключевые структуры данных

Структура заголовка раздела (PartHeader)
Битовые маски слова атрибутов

Реализация механизма безопасности

Процесс безопасной загрузки

image-20250909112532534

Ключевые функции безопасности

Загрузка второго этапа

Загрузка U-Boot

Пример карты памяти:

Переменные окружения U-Boot:

Реализация безопасной загрузки

Процесс аутентификации

Шаги верификации RSA:

image-20250909112856529

Процесс расшифровки AES:

Расширенные возможности

Мультизагрузка

Конфигурация регистров:

Пример разметки Flash-памяти:

Отладка и оптимизация

Устранение распространенных проблем

Диагностика сбоев загрузки:

СимптомВозможная причинаРешение
Зависание на этапе BootROMСбой определения загрузочного устройстваПроверьте конфигурацию выводов MIO
Сбой загрузки FSBLНедостаточно места в OCMОптимизируйте размер FSBL до <192KB
Тайм-аут конфигурации PLТактовый сигнал интерфейса PCAP не включенПроверьте конфигурацию регистра SLCR

Советы по оптимизации производительности:

Приложение

Справочник по ключевым регистрам

Регистры SLCR:

Регистры DevCfg:

Ссылки на официальную документацию